//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-07-21) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>

#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
int timer0_counter = 0;
bit busy;
char buf[50];
int Key_state = 0;
// extern uint16_t ADC_Convert(uint8_t ch);
//<<AICUBE_USER_INCLUDE_BEGIN>>
//   在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>

//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////

void MQTT_Send()
{
    uint16_t batt;
    batt = ADC_Convert(8);
    if (batt < 2440)
        batt = 2440;
    if (batt > 3440)
        batt = 3440;
    batt -= 2440; // 设置3V时电压为0%
    batt /= 10;
    LED1 = LED2 = LED3 = LED4 = 1;
    switch (Key_state)
    {
    case 2:
        sprintf(buf, "{\"KeyStatus\":\"接车\",\"vol\":%d}\r\n", batt);
        LED2 = 0;
        break;
    case 3:
        sprintf(buf, "{\"KeyStatus\":\"暂停\",\"vol\":%d}\r\n", batt);
        LED3 = 0;
        break;
    case 4:
        sprintf(buf, "{\"KeyStatus\":\"收工\",\"vol\":%d}\r\n", batt);
        LED4 = 0;
        break;
    default:
        break;
    }
    uart2SendStr(buf);
    timer0_counter = 0;
}
void CheckKeys()
{
    if (PW_SW == 0)
    {
        delay_ms(10);
        if (PW_SW == 0)
        {
            Key_state = 2;
            MQTT_Send();
            while (!PW_SW)
                if (PW_SW == 0 & K4 == 0) // 关机
                {
                    timer0_counter = 0;
                    while (PW_SW == 0 & K4 == 0)
                    {
                        if (timer0_counter > 60)
                        {
                            PW_HOLD = 0;
                            LED1 = LED2 = LED3 = LED4 = 0;
                        }
                    }
                };
        }
    }
    if (K1 == 0)
    {
        delay_ms(10);
        if (K1 == 0)
        {
            while (!K1)
                ;
        }
    }

    if (K2 == 0)
    {
        delay_ms(10);
        if (K2 == 0)
        {
            Key_state = 2;
            MQTT_Send();
            while (!K2)
                ;
        }
    }

    if (K3 == 0)
    {
        delay_ms(10);
        if (K3 == 0)
        {
            Key_state = 3;
            MQTT_Send();
            while (!K3)
                ;
        }
    }

    if (K4 == 0)
    {
        delay_ms(10);
        if (K4 == 0)
        {

            Key_state = 4;
            MQTT_Send();
            while (!K4)
                if (PW_SW == 0 & K4 == 0) // 关机
                {
                    timer0_counter = 0;
                    while (PW_SW == 0 & K4 == 0)
                    {
                        if (timer0_counter > 60)
                        {
                            PW_HOLD = 0;
                            LED1 = LED2 = LED3 = LED4 = 0;
                        }
                    }
                };
        }
    }
}
void E33V_Init(void)
{
    int i = 0;
    E33V_CTRL = 0;
    while (LINK == 0)
    {
        LED1 = LED2 = LED3 = LED4 = 0;
        delay_ms(500);
        LED1 = LED2 = LED3 = LED4 = 1;
        delay_ms(500);
        i++;
        if (i > 90)
        {
            E33V_CTRL = 1;
            break;
        }
    }
}
void main(void)
{
    SYS_Init();
    timer0_counter = 0;
    while (PW_SW == 0)
    {
        if (timer0_counter > 60)
        {
            PW_HOLD = 1;
            TIMER0_Stop();
            timer0_counter = 0;
            break;
        }
    }
    TIMER0_Run();
    while (1)
    {
        USBLIB_OUT_Done(); // 查询方式处理USB接收的数据
        if (LINK == 0)
        {
            E33V_Init();
        }
        LED1 = !LINK;
        if (timer0_counter > 6000) // 5分钟一次
        {
            timer0_counter = 0;
            MQTT_Send();
        }
        CheckKeys();
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();    // 使能访问扩展XFR
    AccessCodeFastest();  // 设置最快速度访问程序代码
    AccessIXramFastest(); // 设置最快速度访问内部XDATA
    IAP_SetTimeBase();    // 设置IAP等待参数,产生1us时基

    P0M0 = 0x00;
    P0M1 = 0x00; // 初始化P0口为准双向口模式
    P1M0 = 0x00;
    P1M1 = 0x00; // 初始化P1口为准双向口模式
    P2M0 = 0x00;
    P2M1 = 0x00; // 初始化P2口为准双向口模式
    P3M0 = 0x00;
    P3M1 = 0x00; // 初始化P3口为准双向口模式
    P4M0 = 0x00;
    P4M1 = 0x00; // 初始化P4口为准双向口模式
    P5M0 = 0x00;
    P5M1 = 0x00; // 初始化P5口为准双向口模式
    P6M0 = 0x00;
    P6M1 = 0x00; // 初始化P6口为准双向口模式
    P7M0 = 0x00;
    P7M1 = 0x00; // 初始化P7口为准双向口模式

    CLK_Init();    // 时钟模块初始化
    PORT0_Init();  // P0口初始化
    PORT1_Init();  // P1口初始化
    PORT2_Init();  // P2口初始化
    PORT3_Init();  // P3口初始化
    TIMER0_Init(); // 定时器0初始化
    UART2_Init();  // 串口2初始化
                   //    EXTI0_Init();  // INT0初始化
                   //    EXTI2_Init();  // INT2初始化
                   //    EXTI3_Init();  // INT3初始化
    ADC_Init();    // ADC初始化
    I2C_Init();    // I2C初始化
    USBLIB_Init(); // USB库初始化

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

    EnableGlobalInt(); // 使能全局中断
}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
    do
    {
        NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6
    } while (--us);
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
        i = MAIN_Fosc / 6000;
        while (--i)
            ;
    } while (--ms);
}

//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
